﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using Model;

namespace BusinessObject
{
    public class TaskBO : Repository<Task>
    {
        #region Singleton

        private static readonly TaskBO _instance = new TaskBO();

        /// <summary>
        /// Instância do objeto singleton.
        /// </summary>
        public static TaskBO Instance
        {
            get { return _instance; }
        }

        private TaskBO() { }

        #endregion Singleton

        /// <summary>
        /// Este método faz o import de Task de acordo com o backLogItem passado.
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public bool Import(HttpPostedFile file, Project project)
        {
            if (!string.IsNullOrEmpty(file.FileName))
            {
                try
                {
                    //Lê o arquivo inteiro, pois se der um exception os dados restantes não seram lidos.
                    using (StreamReader sr = new StreamReader(file.InputStream))
                    {
                        String line;

                        while ((line = sr.ReadLine()) != null)
                        {
                            IList<string> lineObject;

                            Task task = new Task();

                            //aqui dever ser entre plic's pois é do tipo char o separador.
                            lineObject = line.Split(';');

                            //os atributos são na ordem do template do arquivo
                            task.Project = project;
                            task.Nome = lineObject[0];
                            task.Descricao = lineObject[1];
                            if (!(lineObject[2] == String.Empty))
                                task.MelhorCaso = Double.Parse(lineObject[2]);
                            if (!(lineObject[3] == String.Empty))
                                task.CasoMedio = Double.Parse(lineObject[3]);
                            if (!(lineObject[4] == String.Empty))
                                task.PiorCaso = Double.Parse(lineObject[4]);

                            //grava o objeto
                            TaskBO.Instance.Save(task);
                        }
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("O Arquivo" + file.FileName + " não pode ser lido. Erro: " + e.Message);
                }
            }

            return true;
        }

        /// <summary>
        /// Método para recuparar as tarefas de um projeto
        /// </summary>
        /// <param name="project"></param>
        /// <returns></returns>
        public IList<Task> GetTaskByProject(Project project)
        {
            IList<Task> tarefas = new List<Task>();

            foreach (Task tarefa in base.GetByCriteria(t => t.Project.Id == project.Id))
            {
                tarefas.Add(tarefa);
            }

            return tarefas;
        }

        /// <summary>
        /// Método para recuperar as tarefas de uma determinada História
        /// </summary>
        /// <param name="historia"></param>
        /// <returns></returns>
        public IList<Task> GetTaskByHistory(History historia)
        {
            return base.GetByCriteria(t => t.History.Id == historia.Id);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public IList<Task> GetTaskByIds(IList<int> ids)
        {
            IList<Task> tarefas = new List<Task>();
            foreach (int id in ids)
            {
                tarefas.Add(base.GetById(id));
            }
            return tarefas;
        }

        /// <summary>
        ///  Método para recuperar as tarefas de um determinado Sprint
        /// </summary>
        /// <param name="sprintId"></param>
        /// <returns></returns>
        public IList<Task> GetTaskBySprint(Sprint sprint)
        {
            //IList<Task> tarefas = new List<Task>();
            //foreach (var tarefa in SprintBO.Instance.GetById(sprintId).Task)
            //{
            //    tarefas.Add(tarefa);
            //}
            return base.GetByCriteria(t => t.Sprint.Id == sprint.Id);
        }

        /// <summary>
        ///  Método para recuperar as tarefas de um determinado Sprint ou sem associação
        /// </summary>
        /// <param name="sprintId"></param>
        /// <returns></returns>
        public IList<Task> GetTaskByOrWithoutSprint(Sprint sprint)
        {
            return base.GetByCriteria(t => t.Sprint.Id == sprint.Id || t.Sprint == null);
        }
    }
}